// 莫比乌斯反演
// Crash 数字表格
// 测试链接 ：https://www.luogu.com.cn/problem/P1829
// 相关帖子 ：https://www.cnblogs.com/dx123/p/16977336.html
// 提交以下的code，可以直接通过

#include <bits/stdc++.h>

using namespace std;

const int MAXN = 10000001;
const int P = 20101009;
int cnt;
int mu[MAXN];
int prime[MAXN];
int S[MAXN];
bool visited[MAXN];

void init()
{
    mu[1] = 1;
    for(int i = 2; i < MAXN; ++i)
    {
        if(!visited[i])
        {
            prime[++cnt] = i;
            mu[i] = -1;
        }
        for(int j = 1; i * prime[j] < MAXN; ++j)
        {
            visited[i * prime[j]] = true;
            if(i % prime[j] == 0) break;
            mu[i * prime[j]] = -mu[i];
        }
    }
    for(int i = 1; i < MAXN; ++i)
    {
        S[i] = (S[i - 1] + (1LL * mu[i] * i * i % P + P)) % P;
    }
}

int G(int n, int m)
{
    return (1LL * n * (n + 1) / 2 % P) * (1LL * m * (m + 1) / 2 % P) % P;
}

int F(int n, int m)
{
    int ans = 0;
    for(int l = 1, r; l <= n; l = r + 1)
    {
        r = min(n / (n / l), m / (m / l));
        ans = (ans + (1LL * (S[r] - S[l - 1]) * G(n / l, m / l) % P + P)) % P;
    }
    return ans;
}

int compute(int n, int m)
{
    if(n > m) swap(n, m);
    int ans = 0;
    for(int l = 1, r; l <= n; l = r + 1)
    {
        r = min(n / (n / l), m / (m / l));
        ans = (ans + (1LL * (r - l + 1) * (l + r) / 2 % P * F(n / l, m / l) % P)) % P;
    }
    return ans;
}

int main()
{
    init();
    int n, m;
    scanf("%d%d", &n, &m);
    printf("%d\n", compute(n, m));

    return 0;
}